Resumen
Este informe presenta una investigación sobre el impacto de la
pandemia de COVID-19 en el rendimiento académico de estudiantes de
primer año. Se utilizaron técnicas espaciales para examinar las
calificaciones obtenidas durante los años 2017, 2018, 2020, 2021 y 2021,
donde la principal contribución corresponde a la aplicación de un modelo
bayesiano multivariado condicionalmente autorregresivo (MCAR) para
explicar y predecir las calificaciones a partir de ́ındices de pobreza,
desarrollo comunal, cantidad de colegios particulares y promedio PSU por
comuna. Este enfoque nos permitió contrastar ajustes de modelos clásicos
que no consideran la componente espacial y modelos areales que poseen
dependencia de vecinos contiguos. Los métodos anteriores fueron
aplicados en las regiones de Valparaíso y Metropolitana al existir mayor
cantidad de estudiantes en estas zonas. Los resultados muestran como las
calificaciones no se correlacionan con las covariables propuestas, a
diferencia de años previos a la pandemia.
Introducción
El rendimiento de los estudiantes universitarios ha sido siempre un
tema de interés para las universidades. Para la Universidad Técnica
Federico Santa María lo ha sido particularmente con sus alumnos de
primer año, puesto que históricamente han tenido una alta tasa de
reprobación en ramos del ciclo básico de ingeniería (Del Rio
2018). Sin embargo, la pandemia de COVID19 provocó resultados
nunca antes vistos en la universidad a lo largo de todas las carreras,
sin importar el año de ingreso. Esto motivó en primer lugar el análisis
a realizar, donde buscaremos explicar y predecir las calificaciones de
primer año.
Para esto, visualizaremos los datos mediante herramientas clásicas
del análisis descriptivo, para luego verificar como se distribuyen los
promedios de notas de las principales asignaturas a lo largo de las
regiones de Chile.
Enseguida se presentará una introducción a la estadística espacial,
donde se revisarán conceptos de autocorrelación espacial y modelos de
área. Esto se ejemplificará a través del índice de Morán y los modelos
condicionalmente autoregresivos, CAR.
En lo que sigue, y en honor a la poca cantidad de datos para realizar
un análisis de caracter nacional, nos centraremos en la región de
Valparaíso y sus comunas. Aplicaremos los conceptos revisados
anteriormente usando como variables explicativas ́ındices de pobreza,
desarrollo comunal, cantidad de colegios particulares, promedio PSU por
comuna y compararemos los modelos CAR para los casos univariados y
multivariados con métodos clásicos de Machine Learning. Para discernir
el rendimiento de estos se utilizará el criterio de información
bayesiano, BIC.
Finalmente, se presentarán los resultados y las conclusiones
obtenidas del análisis.
Análisis exploratorio de datos
La base de datos contiene información de las calificaciones obtenidas
durante los años 2020 y 2021 por todos los estudiantes de campus y sedes
de la universidad resumida de la siguiente manera:
2017-2
Acá se puede escribir:
2018-1
Acá se puede escribir:
2018-2
Acá se puede escribir:
2020-1
Acá se puede escribir:
Para realizar el análisis descriptivo, se modificó la base de datos
de la siguiente manera:
Se escogieron solo estudiantes de primer año de 2020 y
2021.
Fueron seleccionadas las asignaturas de FIS100, FIS110, MAT021,
MAT022, IWI131, QUI010 y IWG101.
Se filtró por estudianes que tuvieran su ESTADO
NOTA como aprobada o reprobada.
Se elimaron columnas que no fueran de interés y fue resumida la
información de cada estudiante en una sola observación.
La base de datos modificada se presenta a continuación
El número de estudiantes provenientes de cada región se presenta en
las siguientes figuras
Podemos observar que en ambos años la mayoría de estudiantes proviene
de la región de Valparaíso y Metropolitana, mientras que la región de
Aysén posee la menor tasa de ingreso. Ahora bien, continuando con el
análisis, los siguientes Donut Plot nos permiten visualizar la tasa de
aprobación por semestre de los ramos clásicos de primer año
académico.
2020-1

2020-2

2021-1

2021-2

En base a los gráficos anteriores podemos rescatar las siguientes
conclusiones:
La tasa de reprobación durante los primeros semestres en todos
los ramos es baja.
Durante el año 2020 se obtuvieron, en general, mejores
rendimientos que el 2021.
FIS110, MAT022 y QUI010 se adjudicaron la “mayor” tasa de
reprobación.
IWG101 fue la asignatura con mejor rendimiento durante los
periodos analizados.
Los semestres pares tuvieron altas tasas de reprobación en
asignaturas propias de primer semestre según malla académica.
Enseguida, una pregunta interesante a responder es: ¿Cómo se
visualizan las notas anteriores geograficamente? Para ello
utilizamos el mapa de Chile extraído de Global
Administrative Areas (2012) seccionado por regiones. Luego, se
obtienen las siguientes figuras
2020-1

2020-2

2021-1

2021-2

De lo anterior, podemos desprender conclusiones que antes no
poseíamos:
La gran mayoría de regiones aprobó con notas superiores a 70 en
promedio.
La zona norte de Chile obtuvo los rendimientos, en promedio, más
descendidos.
Las regiones provenientes de la zona sur de Chile obtuvieron los
rendimientos más altos.
La asignatura que, en promedio, tuvo los rendimientos más bajos
fueron QUI010 y FIS110.
Autocorrelación espacial: Índice de Moran
Dadas las observaciones \(Y_1,\ldots,Y_n\) asociadas a una secuencia
espacial , Moran (1950) propuso el siguiente estadístico
para medir la presencia de autocorrelación de una secuencia espacial
\[I=\frac{n \sum_i \sum_j w_{i
j}\left(Y_i-\bar{Y}\right)\left(Y_j-\bar{Y}\right)}{\left(\sum_{i \neq
j} w_{i j}\right) \sum_i\left(Y_i-\bar{Y}\right)^2}\] donde \(w_{ij}\) son pesos espaciales entre los
sitios y \(\bar{Y}\) denota el promedio
de las observaciones. Bajo normalidad y asumiendo media constante del
proceso, se tiene que \(\mathbb{E}[I]=-\frac{1}{n-1}\). En la
práctica, se considera que
Si \(I>\mathbb{E}[I]\),
entonces un sitio tiende a conectarse a los sitios que tiene similares
atributos. La correlación espacial es positiva y aumenta a medida que el
valor \(|I-\mathbb{E}[I]|\) lo
hace.
Si \(I<\mathbb{E}[I]\), los
valores de sitios conectados a un sitio en particular tienden a ser
disimiles o diferentes.
Modelos CAR univariados y multivariados
Un modelo CAR (Conditional Autoregressive) es un tipo de modelo
estadístico utilizado para analizar datos espaciales. Se usa
frecuentemente para modelar la relación entre las observaciones de una
variable en diferentes lugares geográficos. El modelo asume que la
variable en cada punto está relacionada con las variables en los puntos
vecinos, y se utiliza para generar predicciones para puntos sin datos. A
pesar de que hayan sido introducidos hace décadas atras por Besag (1974). Han tomado mayor relevancia por
su aplicación en temas ingenieriles y médicos.
Para el caso Gaussiano, dadas las componentes espacial \(\{\mathbf{s}_i\}_{i=1}^n\), asociamos un
efecto espacial latente \(\{\phi(\mathbf{s}_i)\}_{i=1}^n\). El modelo
CAR se formula a partir de sus distribuciones full condicionadas
como
\[\phi_i \mid \phi_j, j \neq i \sim
N\left(\sum_{j=1}^{n} c_{ij}y_j, \sigma_i^2\right).\] donde \(\sigma_i\) es un parámetro de covarianza
espacial y \(\mathbf{C}=\{c_{ij}\}\) es
una matriz \(n\times n\) asociada con
las componentes espaciales.
Si definimos \(\mathbf{M}=\text{diag}(\sigma_1^2,\ldots,\sigma_n^2)\).
Bajo la condición de simetría de \(\mathbf{M}^{-1}\mathbf{C}\) y que \(\mathbf{M}^{-1}(\mathbf{I}_n-\mathbf{C})\)
sea definida positiva (Cressie
1993), la distribución conjunta de \(\boldsymbol{\phi}\) está bien definida
como
\[\boldsymbol{\phi}\sim
N(\mathbf{0},\mathbf{\Sigma}_{\text{CAR}})\] donde \(\mathbf{\Sigma}_{\text{CAR}}=(\mathbf{I}_n-\mathbf{C})^{-1}\mathbf{M}\).
Usualmente, es considerado que \(\mathbf{C}=\rho\mathbf{W}\) y \(\mathbf{M}=\sigma^2\mathbf{I}_n\), donde
\(\boldsymbol{W}\) es una matriz de
pesos espaciales, \(\rho\) es un
parámetro de suavizamiento y \(\mathbf{\Sigma}_{\text{CAR}}=\sigma^2\left(\mathbf{I}_n-\rho
\mathbf{W}\right)^{-1}\) si \(\mathbf{W}\) es simétrica. Más aún, si
\(\mathbf{W}\) es además estandariza
por fila, \(\mathbf{\Sigma}_{\text{CAR}}=\sigma^2(\mathbf{D}-\rho
\mathbf{W})^{-1}\), donde \(\mathbf{D}=\text{diag}(\mathbf{W}_{1+},\ldots,\mathbf{W}_{n+})\)
y \(\mathbf{W}_{i+}\) es la suma de los
elementos de la \(i\)-ésima fila de la
matriz \(\mathbf{W}\) para cada \(i=1,\ldots,n\).
Banerjee, Carlin, y Gelfand (2003) extendieron el modelo anterior a
uno full condicionado considerando \(\boldsymbol{\phi}^{\top}=(\boldsymbol{\phi}_1,\ldots,\boldsymbol{\phi}_n)\),
donde cada \(\boldsymbol{\phi}_i=(\phi_{i1},\ldots,\phi_{ip})^{\top}\in\mathbb{R}^{p}\).
Así, la distribución conjunta está definida como
\[\boldsymbol{\phi}\sim
N(\mathbf{0},\mathbf{\Sigma}_{\text{MCAR}})\] donde \(\mathbf{\Sigma}_{\text{MCAR}}=\Lambda\otimes(\mathbf{D}-\rho\mathbf{W})^{-1}\)
y \(\Lambda\) es una matriz de
covarianza definida positiva que ajusta la correlación no espacial entre
variables en cualquier región \(\mathbf{s}_i\), para \(i=1,\ldots,n\).
Diversas variaciones ha tenido el modelo. Leroux, Lei, y Breslow (2000)
propusieron una distribución conjunta (bajo los supuestos adecuados) de
los efectos espaciales dada por \[\boldsymbol{\phi} \sim
\mathrm{N}\left(\mathbf{0},\left[\mathbf{Q}(\mathbf{W}, \rho) \otimes
\mathbf{\Sigma}^{-1}\right]^{-1}\right)\] Aquí \(\mathbf{Q}(\mathbf{W},
\rho)=\rho[\operatorname{diag}(\mathbf{W}
\mathbf{1})-\mathbf{W}]+(1-\rho) \mathbf{I}\) es la matriz de
precisión, mientras que \(\mathbf{\Sigma}\) es una matriz de
covarianza cruzada entre las variables.
Implementación
Para la aplicación se utilizó \(\texttt{R}\) siguiendo los lineamientos
presentes en Banerjee, Carlin, y Gelfand (2003). El índice de Morán se encuentra
en la librería \(\texttt{spdep}\) y la
implementación del modelo MCAR será a través de un marco bayesiano
debido a la estructura condicional explícita, como señalan Gelfand y Vounatsou (2003). Para ello, utilizaremos la
librería \(\texttt{CARBayes}\) (Lee
2013). Se ajustó un modelo lineal suponiendo que \(Y_{kj}\sim N(\mu_{kj},\sigma_j^2)\) y \(\mu_{kj}=\mathbf{x}_k^{\top}\boldsymbol{\beta}_j+\phi_{kj}\),
donde los efectos aleatorios espaciales siguen la estructura MCAR de
Leroux.
Aplicación en la region de Valparaíso
Dada la poca cantidad de datos para realizar un análisis de caracter
nacional, nos centraremos en la región de Valparaíso y sus comunas.
Aplicaremos el modelo lineal anterior usando como variables
explicativas:
Índice de pobreza (Ministerio de Desarrollo
Social y Familia 2020) ajustado usando la metodología de
áreas pequeñas (SAE, por su sigla en inglés). Se encarga de medir el
porcentaje de personas en situación de pobreza por ingresos.
Índice de desarrollo comunal (Universidad Autonoma de
Chile 2020) que otorga un puntaje a las comunas de Chile que
varía entre 0 y 1 según sus condiciones económicas, educativas y de
salud.
Puntaje PSU 2017 por comunas de la región que analiza el promedio
de las pruebas de matemáticas y lenguaje .
Tasa de colegios particulares por número total de
establecimientos educacionales, esto fue calculado usando datos
oficiales de la biblioteca del congreso nacional de Chile.
Graficamente lo anterior se visualiza en la siguiente figura
HASTA ACA saksaksankasknsaknsa
Resultados
Conclusiones y trabajos futuros
Banerjee, Sudipto, Bradley P Carlin, y Alan E Gelfand. 2003.
Hierarchical modeling and analysis for spatial data. Chapman;
Hall/CRC.
Besag, Julian. 1974. «Spatial interaction and the statistical
analysis of lattice systems». Journal of the Royal
Statistical Society: Series B (Methodological) 36 (2): 192-225.
Cressie, Noel. 1993. Statistics for spatial data. John Wiley
& Sons.
Del Rio, Jose Pablo. 2018. «Modelo predictivo para la retencion de
estudiantes de primeros años». Mathesis, Universidad Tecnica
Federico Santa Maria.
Gelfand, Alan E., y Penelope Vounatsou. 2003. «Proper multivariate
conditional autoregressive models for spatial data analysis.»
Biostatistics 4 1: 11-25.
Global Administrative Areas. 2012.
GADM database of Global
Administrative Areas.
www.gadm.org.
Lee, Duncan. 2013.
«CARBayes: An R
Package for Bayesian Spatial Modeling with Conditional
Autoregressive Priors».
Journal of Statistical Software.
https://www.jstatsoft.org/htaccess.php?volume=55&type=i&issue=13.
Leroux, Brian G., Xingye Lei, y Norman E. Breslow. 2000.
«Estimation of Disease Rates in Small Areas: A new Mixed Model for
Spatial Dependence». En.
Ministerio de Desarrollo Social y Familia. 2020.
Estimaciones de
pobreza comunal.
http://observatorio.ministeriodesarrollosocial.gob.cl/pobreza-comunal.
Moran, Patrick AP. 1950. «Notes on continuous stochastic
phenomena». Biometrika 37 (1/2): 17-23.
Universidad Autonoma de Chile. 2020.
Indice de desarrollo
comunal.
https://doi.org/10.32457/ISBN9789568454944962020-ED1.
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBlc3BhY2lhbCBkZSBjYWxpZmljYWNpb25lcyBvYnRlbmlkYXMgZHVyYW50ZSBsYSBwYW5kZW1pYSBwb3INCmVzdHVkaWFudGVzIGRlIHByaW1lciBhw7FvIg0KbGFuZzogZXMNCmF1dGhvcjogIkNsZW1lbnRlIEZlcnJlciINCmRhdGU6ICcyMyBkZSBFbmVybyBkZWwgMjAyMycNCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYg0KbGluay1jaXRhdGlvbnM6IHllcw0KbGlua2NvbG9yOiBibHVlDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KLmxlYWZsZXQgew0KICAgIG1hcmdpbjogYXV0bzsNCn0NCjwvc3R5bGU+DQpgYGANCmBgYHs9aHRtbH0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzMHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogQmxhY2s7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE2cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogQmxhY2s7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCjwvc3R5bGU+DQpgYGANCmBgYHs9aHRtbH0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQogIGJvZHl7DQogIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7DQogIGZvbnQtc2l6ZTogMTJwdDsNCn0NCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KZmlnLmFsaWduPSdjZW50ZXInDQpsaWJyYXJ5KERUKQ0KbGlicmFyeSh4YXJpbmdhbkV4dHJhKQ0KeGFyaW5nYW5FeHRyYTo6dXNlX3BhbmVsc2V0KCkNCnhhcmluZ2FuRXh0cmE6OnN0eWxlX3BhbmVsc2V0X3RhYnMoZm9udF9mYW1pbHkgPSAiaW5oZXJpdCIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KGdnbWFwKSANCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShnZW9kYXRhKQ0KbGlicmFyeShzcCkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeSh0b29scykNCmxpYnJhcnkodGlkeXRlcnJhKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KGdyaWQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2hvd3RleHQpDQpsaWJyYXJ5KHNwZGVwKSAjSGFjZSBjYXNpIHRvZGEgbGEgcGVnYQ0KbGlicmFyeShnZ3RleHQpDQpsaWJyYXJ5KHdyaXRleGwpDQpsaWJyYXJ5KGJpYnRleCkNCmxpYnJhcnkoUmVmTWFuYWdlUikNCmxpYnJhcnkobGVhZmxldCkNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCg0KIyMgTG9hZGluZyBHb29nbGUgZm9udHMgKGh0dHBzOi8vZm9udHMuZ29vZ2xlLmNvbS8pDQpmb250X2FkZF9nb29nbGUoIk9wZW4gU2FucyIsICJvcGVuc2FucyIpDQpmb250X2FkZF9nb29nbGUoIkxhdG8iLCAibGF0byIpDQoNCiMjIEF1dG9tYXRpY2FsbHkgdXNlIHNob3d0ZXh0IHRvIHJlbmRlciB0ZXh0DQpzaG93dGV4dF9hdXRvKCkNCg0KZGF0YV9jbGVhbiA8LSBmdW5jdGlvbihkYXRhLCBhw7FvKSB7DQogIGRhdGFfZGVsIDwtIHN1YnNldChkYXRhLCBzZWxlY3QgPSAtYyhOT01CUkVTLCBBUEVMTElET1MsIENPUlJFTywgUlVULCBBU0lHTkFUVVJBKSkNCiAgDQogICMgRGF0b3MgZmlsdHJhZG9zIGNvbiByYW1vcyBkZSBwcmltZXIgYcOxbw0KICBlc3RhZG9fYXNpZ25hdHVyYSA8LSBjKCJTaW4gVlRSIiwgIkluc2NyaXRhIikNCiAgZXN0YWRvX25vdGEgPC0gYygiQXByb2JhZGEiLCAiUmVwcm9iYWRhIikNCiAgc2lnbGFzIDwtIGMoIklXSTEzMSIsICJNQVQwMjEiLCAiTUFUMDIyIiwgIlFVSTAxMCIsICJGSVMxMDAiLCAiRklTMTEwIiwgIklXRzEwMSIpDQogIGRhdGFfZmlsdHJhZG8gPC0gc3Vic2V0KGRhdGFfZGVsLCBTSUdMQSAlaW4lIHNpZ2xhcyAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEFET19BU0lHTkFUVVJBICVpbiUgZXN0YWRvX2FzaWduYXR1cmEgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEFET19OT1RBICVpbiUgZXN0YWRvX25vdGEgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR0lPTl9PUklHRU4gIT0gIlNJTiBJTkZPUk1BQ0nDk04iKQ0KICANCiAgIyBPcmRlbmFyIHBvciByb2wNCiAgZGF0YV90YXJnZXQgPC0gZGF0YV9maWx0cmFkb1tvcmRlcihkYXRhX2ZpbHRyYWRvJFJPTCksXQ0KICANCiAgIyBGaWx0cmFyIHBvciBsb3MgaW5ncmVzb3MgMjAxOCAobWVjaG9uZXMpDQogIGRhdGFfcmVhbCA8LSBkYXRhX3RhcmdldFtncmVwKGHDsW8sIGRhdGFfdGFyZ2V0JFJPTCksIF0NCiAgDQogICMgRGF0YWZyYW1lIGF1eGlsaWFyIGNvbiB0b2RhIGxhIGluZm9ybWFjacOzbiBkZWwgbWlzbW8gZXN0dWRpYW50ZSBlbiAxIG9ic2VydmFjacOzbg0KICBkZl9hdXggPC0gZGF0YV9yZWFsICU+JSBmaWx0ZXIoIWR1cGxpY2F0ZWQoUk9MKSkNCiAgZGZfYXV4IDwtIHN1YnNldChkZl9hdXgsIHNlbGVjdCA9IC1jKFNJR0xBLCBFU1RBRE9fQVNJR05BVFVSQSwgRVNUQURPX05PVEEsIE5PVEEpKQ0KICANCiAgZm9yIChpIGluIDE6bGVuZ3RoKHNpZ2xhcykpIHsNCiAgICBkZl9hdXhbc2lnbGFzW2ldXSA8LSBOQQ0KICAgIGZvciAoaiBpbiAxOm5yb3coZGF0YV9yZWFsKSkgew0KICAgICAgcm93X2luZGV4IDwtIHdoaWNoKGRmX2F1eCRST0wgPT0gZGF0YV9yZWFsW2osICJST0wiXSRST0wpDQogICAgICBkZl9hdXhbcm93X2luZGV4LCBkYXRhX3JlYWxbaiwgIlNJR0xBIl0kU0lHTEFdIDwtIGRhdGFfcmVhbFtqLCAiTk9UQSJdJE5PVEENCiAgICB9DQogIH0NCiAgDQogICMgRGF0YWZyYW1lIGZpbmFsIGNvbiBwcm92aW5jaWFzIHkgbG9jYWxpemFjaW9uZXMgZ2VvZ3LDoWZpY2FzIGHDsWFkaWRhcyBzZWfDum4gY29tdW5hIA0KICBjb211bmFzX3dpa2kgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvY2NmZXIvRGVza3RvcC9jb211bmFzX2ludGVyw6lzLnhsc3giKQ0KICBjb211bmFzX3dpa2kgPC0gY29tdW5hc193aWtpICU+JSBzbGljZSgtMSkNCiAgY29tdW5hc193aWtpIDwtIHN1YnNldChjb211bmFzX3dpa2ksIHNlbGVjdCA9IGMoTm9tYnJlLCBQcm92aW5jaWEsIExhdGl0dWQsIExvbmdpdHVkKSkgI1BPU0lCTEVTIEVYVEVOU0lPTkVTDQogIA0KICBjb211bmFzX3dpa2kkUHJvdmluY2lhIDwtIGdzdWIoIlRhbWFydWdhbCIsICJJcXVpcXVlIiwgY29tdW5hc193aWtpJFByb3ZpbmNpYSkNCiAgY29tdW5hc193aWtpJFByb3ZpbmNpYSA8LSBnc3ViKCJJcXVpcXVlIiwgIklxdWlxdWUgeSBUYW1hcnVnYWwiLCBjb211bmFzX3dpa2kkUHJvdmluY2lhKQ0KICBjb211bmFzX3dpa2kkUHJvdmluY2lhIDwtIGdzdWIoIlNhbiBGZWxpcGUgZGUgQWNvbmNhZ3VhIiwgIlNhbiBGZWxpcGUiLCBjb211bmFzX3dpa2kkUHJvdmluY2lhKQ0KICBjb211bmFzX3dpa2kkUHJvdmluY2lhIDwtIGdzdWIoIkJpb2LDrW8iLCAiQsOtby1Cw61vIiwgY29tdW5hc193aWtpJFByb3ZpbmNpYSkNCiAgDQogIGNvbXVuYXNfd2lraSROb21icmUgPC0gdG91cHBlcihjb211bmFzX3dpa2kkTm9tYnJlKQ0KICBjb211bmFzX3dpa2kkTm9tYnJlIDwtIGNoYXJ0cigiw6DDqMOsw7LDucOAw4jDjMOSw5nDocOpw63Ds8O6w4HDicONw5PDmiIsICJhZWlvdUFFSU9VYWVpb3VBRUlPVSIsIGNvbXVuYXNfd2lraSROb21icmUpDQogIGNvbXVuYXNfd2lraSROb21icmUgPC0gZ3N1YigiLSIsICIgIiwgY29tdW5hc193aWtpJE5vbWJyZSkNCiAgZGZfYXV4JENPTVVOQV9PUklHRU4gPC0gY2hhcnRyKCLDoMOow6zDssO5w4DDiMOMw5LDmcOhw6nDrcOzw7rDgcOJw43Dk8OaIiwgImFlaW91QUVJT1VhZWlvdUFFSU9VIiwgZGZfYXV4JENPTVVOQV9PUklHRU4pDQogIGRmX2F1eCRDT01VTkFfT1JJR0VOIDwtIGdzdWIoIi0iLCAiICIsIGRmX2F1eCRDT01VTkFfT1JJR0VOKQ0KICANCiAgZGZfYXV4WyJQcm92aW5jaWEiXSA8LSBOQQ0KICANCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRmX2F1eCRDT01VTkFfT1JJR0VOKSl7DQogICAgcm93X2luZGV4IDwtIHdoaWNoKGNvbXVuYXNfd2lraSROb21icmUgPT0gZGZfYXV4W2ksICJDT01VTkFfT1JJR0VOIl0kQ09NVU5BX09SSUdFTikNCiAgICBkZl9hdXhbaSwgIlByb3ZpbmNpYSJdJFByb3ZpbmNpYSA8LSBjb211bmFzX3dpa2lbcm93X2luZGV4LCAiUHJvdmluY2lhIl0kUHJvdmluY2lhDQogIH0NCiAgDQogIGRmX2F1eCRSRUdJT05fT1JJR0VOW2RmX2F1eCRQcm92aW5jaWEgPT0gIkl0YXRhIl0gPC0gIsORdWJsZSINCiAgZGZfYXV4JFJFR0lPTl9PUklHRU5bZGZfYXV4JFByb3ZpbmNpYSA9PSAiRGlndWlsbMOtbiJdIDwtICLDkXVibGUiDQogIGRmX2F1eCRSRUdJT05fT1JJR0VOW2RmX2F1eCRQcm92aW5jaWEgPT0gIlB1bmlsbGEiXSA8LSAiw5F1YmxlIg0KICANCiAgZGZfYXV4JFJFR0lPTl9PUklHRU5bZGZfYXV4JFJFR0lPTl9PUklHRU4gPT0gIlJFR0nDk04gREUgVkFMUEFSQcONU08iXSA8LSAiVmFscGFyYcOtc28iDQogIGRmX2F1eCRSRUdJT05fT1JJR0VOW2RmX2F1eCRSRUdJT05fT1JJR0VOID09ICJSRUdJw5NOIERFIENPUVVJTUJPIl0gPC0gIkNvcXVpbWJvIg0KICBkZl9hdXgkUkVHSU9OX09SSUdFTltkZl9hdXgkUkVHSU9OX09SSUdFTiA9PSAiUkVHScOTTiBBUklDQS1QQVJJTkFDT1RBIl0gPC0gIkFyaWNhIHkgUGFyaW5hY290YSINCiAgZGZfYXV4JFJFR0lPTl9PUklHRU5bZGZfYXV4JFJFR0lPTl9PUklHRU4gPT0gIlJFR0nDk04gTUVUUk9QT0xJVEFOQSJdIDwtICJTYW50aWFnbyBNZXRyb3BvbGl0YW4iDQogIGRmX2F1eCRSRUdJT05fT1JJR0VOW2RmX2F1eCRSRUdJT05fT1JJR0VOID09ICJSRUdJw5NOIERFTCBNQVVMRSJdIDwtICJNYXVsZSINCiAgZGZfYXV4JFJFR0lPTl9PUklHRU5bZGZfYXV4JFJFR0lPTl9PUklHRU4gPT0gIlJFR0nDk04gREUgTEEgQVJBVUNBTsONQSJdIDwtICJBcmF1Y2Fuw61hIg0KICBkZl9hdXgkUkVHSU9OX09SSUdFTltkZl9hdXgkUkVHSU9OX09SSUdFTiA9PSAiUkVHScOTTiBERSBBTlRPRkFHQVNUQSJdIDwtICJBbnRvZmFnYXN0YSINCiAgZGZfYXV4JFJFR0lPTl9PUklHRU5bZGZfYXV4JFJFR0lPTl9PUklHRU4gPT0gIlJFR0nDk04gREUgQVRBQ0FNQSJdIDwtICJBdGFjYW1hIg0KICBkZl9hdXgkUkVHSU9OX09SSUdFTltkZl9hdXgkUkVHSU9OX09SSUdFTiA9PSAiUkVHScOTTiBERSBMT1MgTEFHT1MiXSA8LSAiTG9zIExhZ29zIg0KICBkZl9hdXgkUkVHSU9OX09SSUdFTltkZl9hdXgkUkVHSU9OX09SSUdFTiA9PSAiUkVHScOTTiBERSBMT1MgUsONT1MiXSA8LSAiTG9zIFLDrW9zIg0KICBkZl9hdXgkUkVHSU9OX09SSUdFTltkZl9hdXgkUkVHSU9OX09SSUdFTiA9PSAiUkVHScOTTiBERUwgTElCRVJUQURPUiBHRU5FUkFMIEJFUk5BUkRPIE8nSElHR0lOUyJdIDwtICJMaWJlcnRhZG9yIEdlbmVyYWwgQmVybmFyZG8gTydIaSINCiAgZGZfYXV4JFJFR0lPTl9PUklHRU5bZGZfYXV4JFJFR0lPTl9PUklHRU4gPT0gIlJFR0nDk04gREVMIELDjU8tQsONTyJdIDwtICJCw61vLULDrW8iDQogIGRmX2F1eCRSRUdJT05fT1JJR0VOW2RmX2F1eCRSRUdJT05fT1JJR0VOID09ICJSRUdJw5NOIERFIFRBUkFQQUPDgSJdIDwtICJUYXJhcGFjw6EiDQogIGRmX2F1eCRSRUdJT05fT1JJR0VOW2RmX2F1eCRSRUdJT05fT1JJR0VOID09ICJSRUdJw5NOIERFIEFZU8OJTiBERUwgR0VORVJBTCBDQVJMT1MgSULDgcORRVogREVMIENBTVAiXSA8LSAiQXlzw6luIGRlbCBHZW5lcmFsIEliYcOxZXogZGVsIENhbSINCiAgZGZfYXV4JFJFR0lPTl9PUklHRU5bZGZfYXV4JFJFR0lPTl9PUklHRU4gPT0gIlJFR0nDk04gREUgTUFHQUxMQU5FUyBZIERFIExBIEFOVMOBUlRJQ0EgQ0hJTEVOQSJdIDwtICJNYWdhbGxhbmVzIHkgQW50w6FydGljYSBDaGlsZW5hIg0KICANCiAgZGYgPC0gZGZfYXV4DQp9DQoNCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQpib2R5IHsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQo8Y2VudGVyPioqUmVzdW1lbioqPC9jZW50ZXI+DQoNCkVzdGUgaW5mb3JtZSBwcmVzZW50YSB1bmEgaW52ZXN0aWdhY2nDs24gc29icmUgZWwgaW1wYWN0byBkZSBsYSBwYW5kZW1pYSBkZSBDT1ZJRC0xOSBlbiBlbCByZW5kaW1pZW50byBhY2Fkw6ltaWNvIGRlIGVzdHVkaWFudGVzIGRlIHByaW1lciBhw7FvLiBTZSB1dGlsaXphcm9uIHTDqWNuaWNhcyBlc3BhY2lhbGVzIHBhcmEgZXhhbWluYXIgbGFzIGNhbGlmaWNhY2lvbmVzIG9idGVuaWRhcyBkdXJhbnRlIGxvcyBhw7FvcyAyMDE3LCAyMDE4LCAyMDIwLCAyMDIxIHkgMjAyMSwgZG9uZGUgbGEgcHJpbmNpcGFsIGNvbnRyaWJ1Y2nDs24gY29ycmVzcG9uZGUgYSBsYSBhcGxpY2FjacOzbiBkZSB1biBtb2RlbG8gYmF5ZXNpYW5vIG11bHRpdmFyaWFkbyBjb25kaWNpb25hbG1lbnRlIGF1dG9ycmVncmVzaXZvIChNQ0FSKSBwYXJhIGV4cGxpY2FyIHkgcHJlZGVjaXIgbGFzIGNhbGlmaWNhY2lvbmVzIGEgcGFydGlyIGRlIMyBxLFuZGljZXMgZGUgcG9icmV6YSwgZGVzYXJyb2xsbyBjb211bmFsLCBjYW50aWRhZCBkZSBjb2xlZ2lvcyBwYXJ0aWN1bGFyZXMgeSBwcm9tZWRpbyBQU1UgcG9yIGNvbXVuYS4gRXN0ZSBlbmZvcXVlIG5vcyBwZXJtaXRpw7MgY29udHJhc3RhciBhanVzdGVzIGRlIG1vZGVsb3MgY2zDoXNpY29zIHF1ZSBubyBjb25zaWRlcmFuIGxhIGNvbXBvbmVudGUgZXNwYWNpYWwgeSBtb2RlbG9zIGFyZWFsZXMgcXVlIHBvc2VlbiBkZXBlbmRlbmNpYSBkZSB2ZWNpbm9zIGNvbnRpZ3Vvcy4gTG9zIG3DqXRvZG9zIGFudGVyaW9yZXMgZnVlcm9uIGFwbGljYWRvcyBlbiBsYXMgcmVnaW9uZXMgZGUgVmFscGFyYcOtc28geSBNZXRyb3BvbGl0YW5hIGFsIGV4aXN0aXIgbWF5b3IgY2FudGlkYWQgZGUgZXN0dWRpYW50ZXMgZW4gZXN0YXMgem9uYXMuIExvcyByZXN1bHRhZG9zIG11ZXN0cmFuIGNvbW8gbGFzIGNhbGlmaWNhY2lvbmVzIG5vIHNlIGNvcnJlbGFjaW9uYW4gY29uIGxhcyBjb3ZhcmlhYmxlcyBwcm9wdWVzdGFzLCBhIGRpZmVyZW5jaWEgZGUgYcOxb3MgcHJldmlvcyBhIGxhIHBhbmRlbWlhLg0KDQojIyBJbnRyb2R1Y2Npw7NuDQoNCkVsIHJlbmRpbWllbnRvIGRlIGxvcyBlc3R1ZGlhbnRlcyB1bml2ZXJzaXRhcmlvcyBoYSBzaWRvIHNpZW1wcmUgdW4gdGVtYSBkZSBpbnRlcsOpcyBwYXJhIGxhcyB1bml2ZXJzaWRhZGVzLiBQYXJhIGxhIFVuaXZlcnNpZGFkIFTDqWNuaWNhIEZlZGVyaWNvIFNhbnRhIE1hcsOtYSBsbyBoYSBzaWRvIHBhcnRpY3VsYXJtZW50ZSBjb24gc3VzIGFsdW1ub3MgZGUgcHJpbWVyIGHDsW8sIHB1ZXN0byBxdWUgaGlzdMOzcmljYW1lbnRlIGhhbiB0ZW5pZG8gdW5hIGFsdGEgdGFzYSBkZSByZXByb2JhY2nDs24gZW4gcmFtb3MgZGVsIGNpY2xvIGLDoXNpY28gZGUgaW5nZW5pZXLDrWEgW0B1c20yMDE4XS4gU2luIGVtYmFyZ28sIGxhIHBhbmRlbWlhIGRlIENPVklEMTkgcHJvdm9jw7MgcmVzdWx0YWRvcyBudW5jYSBhbnRlcyB2aXN0b3MgZW4gbGEgdW5pdmVyc2lkYWQgYSBsbyBsYXJnbyBkZSB0b2RhcyBsYXMgY2FycmVyYXMsIHNpbiBpbXBvcnRhciBlbCBhw7FvIGRlIGluZ3Jlc28uIEVzdG8gbW90aXbDsyBlbiBwcmltZXIgbHVnYXIgZWwgYW7DoWxpc2lzIGEgcmVhbGl6YXIsIGRvbmRlIGJ1c2NhcmVtb3MgZXhwbGljYXIgeSBwcmVkZWNpciBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgcHJpbWVyIGHDsW8uDQoNClBhcmEgZXN0bywgdmlzdWFsaXphcmVtb3MgbG9zIGRhdG9zIG1lZGlhbnRlIGhlcnJhbWllbnRhcyBjbMOhc2ljYXMgZGVsIGFuw6FsaXNpcyBkZXNjcmlwdGl2bywgcGFyYSBsdWVnbyB2ZXJpZmljYXIgY29tbyBzZSBkaXN0cmlidXllbiBsb3MgcHJvbWVkaW9zIGRlIG5vdGFzIGRlIGxhcyBwcmluY2lwYWxlcyBhc2lnbmF0dXJhcyBhIGxvIGxhcmdvIGRlIGxhcyByZWdpb25lcyBkZSBDaGlsZS4NCg0KRW5zZWd1aWRhIHNlIHByZXNlbnRhcsOhIHVuYSBpbnRyb2R1Y2Npw7NuIGEgbGEgZXN0YWTDrXN0aWNhIGVzcGFjaWFsLCBkb25kZSBzZSByZXZpc2Fyw6FuIGNvbmNlcHRvcyBkZSBhdXRvY29ycmVsYWNpw7NuIGVzcGFjaWFsIHkgbW9kZWxvcyBkZSDDoXJlYS4gRXN0byBzZSBlamVtcGxpZmljYXLDoSBhIHRyYXbDqXMgZGVsIMOtbmRpY2UgZGUgTW9yw6FuIHkgbG9zIG1vZGVsb3MgY29uZGljaW9uYWxtZW50ZSBhdXRvcmVncmVzaXZvcywgQ0FSLg0KDQpFbiBsbyBxdWUgc2lndWUsIHkgZW4gaG9ub3IgYSBsYSBwb2NhIGNhbnRpZGFkIGRlIGRhdG9zIHBhcmEgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGRlIGNhcmFjdGVyIG5hY2lvbmFsLCBub3MgY2VudHJhcmVtb3MgZW4gbGEgcmVnacOzbiBkZSBWYWxwYXJhw61zbyB5IHN1cyBjb211bmFzLiBBcGxpY2FyZW1vcyBsb3MgY29uY2VwdG9zIHJldmlzYWRvcyBhbnRlcmlvcm1lbnRlIHVzYW5kbyBjb21vIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgzIHEsW5kaWNlcyBkZSBwb2JyZXphLCBkZXNhcnJvbGxvIGNvbXVuYWwsIGNhbnRpZGFkIGRlIGNvbGVnaW9zIHBhcnRpY3VsYXJlcywgcHJvbWVkaW8gUFNVIHBvciBjb211bmEgeSBjb21wYXJhcmVtb3MgbG9zIG1vZGVsb3MgQ0FSIHBhcmEgbG9zIGNhc29zIHVuaXZhcmlhZG9zIHkgbXVsdGl2YXJpYWRvcyBjb24gbcOpdG9kb3MgY2zDoXNpY29zIGRlIE1hY2hpbmUgTGVhcm5pbmcuIFBhcmEgZGlzY2VybmlyIGVsIHJlbmRpbWllbnRvIGRlIGVzdG9zIHNlIHV0aWxpemFyw6EgZWwgY3JpdGVyaW8gZGUgaW5mb3JtYWNpw7NuIGJheWVzaWFubywgQklDLg0KDQpGaW5hbG1lbnRlLCBzZSBwcmVzZW50YXLDoW4gbG9zIHJlc3VsdGFkb3MgeSBsYXMgY29uY2x1c2lvbmVzIG9idGVuaWRhcyBkZWwgYW7DoWxpc2lzLg0KDQojIyBBbsOhbGlzaXMgZXhwbG9yYXRvcmlvIGRlIGRhdG9zDQoNCkxhIGJhc2UgZGUgZGF0b3MgY29udGllbmUgaW5mb3JtYWNpw7NuIGRlIGxhcyBjYWxpZmljYWNpb25lcyBvYnRlbmlkYXMgZHVyYW50ZSBsb3MgYcOxb3MgMjAyMCB5IDIwMjEgcG9yIHRvZG9zIGxvcyBlc3R1ZGlhbnRlcyBkZSBjYW1wdXMgeSBzZWRlcyBkZSBsYSB1bml2ZXJzaWRhZCByZXN1bWlkYSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOg0KDQo6OjogcGFuZWxzZXQNCjwhLS0gMjAxNy0xIC0tPg0KDQo6OjogcGFuZWwNClsyMDE3LTFdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyBMZWVyIGVsIGFyY2hpdm8gMjAxNy0xDQpkYXRhMjAxN18xIDwtIHJlYWRfZXhjZWwoIlBsYW50aWxsYSBOb3RhcyBGaW5hbGVzIDIueGxzeCIsIHNoZWV0ID0gMSkNCmRhdGF0YWJsZSgNCiAgaGVhZChkYXRhMjAxN18xLDQpLCBleHRlbnNpb25zID0gJ0ZpeGVkQ29sdW1ucycsDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgIGRvbSA9ICd0JywNCiAgICBzY3JvbGxYID0gVFJVRSwNCiAgICBmaXhlZENvbHVtbnMgPSBUUlVFDQogICkpDQpgYGANCjo6Og0KDQo8IS0tIDIwMTctMiAtLT4NCg0KOjo6IHBhbmVsDQpbMjAxNy0yXXsucGFuZWwtbmFtZX0NCg0KQWPDoSBzZSBwdWVkZSBlc2NyaWJpcjoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTGVlciBlbCBhcmNoaXZvIDIwMTctMg0KZGF0YTIwMTdfMiA8LSByZWFkX2V4Y2VsKCJQbGFudGlsbGEgTm90YXMgRmluYWxlcyAyLnhsc3giLCBzaGVldCA9IDIpDQpkYXRhdGFibGUoDQogIGhlYWQoZGF0YTIwMTdfMiw0KSwgZXh0ZW5zaW9ucyA9ICdGaXhlZENvbHVtbnMnLA0KICBvcHRpb25zID0gbGlzdCgNCiAgICBkb20gPSAndCcsDQogICAgc2Nyb2xsWCA9IFRSVUUsDQogICAgZml4ZWRDb2x1bW5zID0gVFJVRQ0KICApKQ0KYGBgDQo6OjoNCg0KPCEtLSAyMDE4LTEgLS0+DQoNCjo6OiBwYW5lbA0KWzIwMTgtMV17LnBhbmVsLW5hbWV9DQoNCkFjw6Egc2UgcHVlZGUgZXNjcmliaXI6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQojIExlZXIgZWwgYXJjaGl2byAyMDE4LTENCmRhdGEyMDE4XzEgPC0gcmVhZF9leGNlbCgiUGxhbnRpbGxhIE5vdGFzIEZpbmFsZXMgMi54bHN4Iiwgc2hlZXQgPSAzKQ0KZGF0YXRhYmxlKA0KICBoZWFkKGRhdGEyMDE4XzEsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgb3B0aW9ucyA9IGxpc3QoDQogICAgZG9tID0gJ3QnLA0KICAgIHNjcm9sbFggPSBUUlVFLA0KICAgIGZpeGVkQ29sdW1ucyA9IFRSVUUNCiAgKSkNCmBgYA0KOjo6DQoNCjwhLS0gMjAxOC0yIC0tPg0KDQo6OjogcGFuZWwNClsyMDE4LTJdey5wYW5lbC1uYW1lfQ0KDQpBY8OhIHNlIHB1ZWRlIGVzY3JpYmlyOg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyBMZWVyIGVsIGFyY2hpdm8gMjAxOC0yDQpkYXRhMjAxOF8yIDwtIHJlYWRfZXhjZWwoIlBsYW50aWxsYSBOb3RhcyBGaW5hbGVzIDIueGxzeCIsIHNoZWV0ID0gNCkNCmRhdGF0YWJsZSgNCiAgaGVhZChkYXRhMjAxOF8yLDQpLCBleHRlbnNpb25zID0gJ0ZpeGVkQ29sdW1ucycsDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgIGRvbSA9ICd0JywNCiAgICBzY3JvbGxYID0gVFJVRSwNCiAgICBmaXhlZENvbHVtbnMgPSBUUlVFDQogICkpDQpgYGANCjo6Og0KDQo8IS0tIDIwMjAtMSAtLT4NCg0KOjo6IHBhbmVsDQpbMjAyMC0xXXsucGFuZWwtbmFtZX0NCg0KQWPDoSBzZSBwdWVkZSBlc2NyaWJpcjoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTGVlciBlbCBhcmNoaXZvIDIwMjAtMQ0KZGF0YTIwMjBfMSA8LSByZWFkX2V4Y2VsKCJQbGFudGlsbGEgTm90YXMgRmluYWxlcy54bHN4Iiwgc2hlZXQgPSAxKQ0KZGF0YXRhYmxlKA0KICBoZWFkKGRhdGEyMDIwXzEsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgb3B0aW9ucyA9IGxpc3QoDQogICAgZG9tID0gJ3QnLA0KICAgIHNjcm9sbFggPSBUUlVFLA0KICAgIGZpeGVkQ29sdW1ucyA9IFRSVUUNCiAgKSkNCmBgYA0KOjo6DQoNCjwhLS0gMjAyMC0yIC0tPg0KDQo6OjogcGFuZWwNClsyMDIwLTJdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyBMZWVyIGVsIGFyY2hpdm8gMjAyMC0yDQpkYXRhMjAyMF8yIDwtIHJlYWRfZXhjZWwoIlBsYW50aWxsYSBOb3RhcyBGaW5hbGVzLnhsc3giLCBzaGVldCA9IDIpDQpkYXRhdGFibGUoDQogIGhlYWQoZGF0YTIwMjBfMiw0KSwgZXh0ZW5zaW9ucyA9ICdGaXhlZENvbHVtbnMnLA0KICBvcHRpb25zID0gbGlzdCgNCiAgICBkb20gPSAndCcsDQogICAgc2Nyb2xsWCA9IFRSVUUsDQogICAgZml4ZWRDb2x1bW5zID0gVFJVRQ0KICApKQ0KYGBgDQo6OjoNCg0KPCEtLSAyMDIxLTEgLS0+DQoNCjo6OiBwYW5lbA0KWzIwMjEtMV17LnBhbmVsLW5hbWV9DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQojIExlZXIgZWwgYXJjaGl2byAyMDIxLTENCmRhdGEyMDIxXzEgPC0gcmVhZF9leGNlbCgiUGxhbnRpbGxhIE5vdGFzIEZpbmFsZXMueGxzeCIsIHNoZWV0ID0gMykNCmRhdGF0YWJsZSgNCiAgaGVhZChkYXRhMjAyMV8xLDQpLCBleHRlbnNpb25zID0gJ0ZpeGVkQ29sdW1ucycsDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgIGRvbSA9ICd0JywNCiAgICBzY3JvbGxYID0gVFJVRSwNCiAgICBmaXhlZENvbHVtbnMgPSBUUlVFDQogICkpDQpgYGANCjo6Og0KDQo8IS0tIDIwMjEtMiAtLT4NCg0KOjo6IHBhbmVsDQpbMjAyMS0yXXsucGFuZWwtbmFtZX0NCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTGVlciBlbCBhcmNoaXZvIDIwMjEtMg0KZGF0YTIwMjFfMiA8LSByZWFkX2V4Y2VsKCJQbGFudGlsbGEgTm90YXMgRmluYWxlcy54bHN4Iiwgc2hlZXQgPSA0KQ0KZGF0YXRhYmxlKA0KICBoZWFkKGRhdGEyMDIxXzIsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgb3B0aW9ucyA9IGxpc3QoDQogICAgZG9tID0gJ3QnLA0KICAgIHNjcm9sbFggPSBUUlVFLA0KICAgIGZpeGVkQ29sdW1ucyA9IFRSVUUNCiAgKSkNCmBgYA0KOjo6DQoNCjwhLS0gMjAyMi0xIC0tPg0KDQo6OjogcGFuZWwNClsyMDIyLTFdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyBMZWVyIGVsIGFyY2hpdm8gMjAyMi0xDQpkYXRhMjAyMl8xIDwtIHJlYWRfZXhjZWwoIlBsYW50aWxsYSBOb3RhcyBGaW5hbGVzIDIueGxzeCIsIHNoZWV0ID0gNSkNCmRhdGF0YWJsZSgNCiAgaGVhZChkYXRhMjAyMl8xLDQpLCBleHRlbnNpb25zID0gJ0ZpeGVkQ29sdW1ucycsDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgIGRvbSA9ICd0JywNCiAgICBzY3JvbGxYID0gVFJVRSwNCiAgICBmaXhlZENvbHVtbnMgPSBUUlVFDQogICkpDQpgYGANCjo6Og0KDQo8IS0tIDIwMjItMiAtLT4NCg0KOjo6IHBhbmVsDQpbMjAyMi0yXXsucGFuZWwtbmFtZX0NCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTGVlciBlbCBhcmNoaXZvIDIwMjItMg0KZGF0YTIwMjJfMiA8LSByZWFkX2V4Y2VsKCJQbGFudGlsbGEgTm90YXMgRmluYWxlcyAyLnhsc3giLCBzaGVldCA9IDYpDQpkYXRhdGFibGUoDQogIGhlYWQoZGF0YTIwMjJfMiw0KSwgZXh0ZW5zaW9ucyA9ICdGaXhlZENvbHVtbnMnLA0KICBvcHRpb25zID0gbGlzdCgNCiAgICBkb20gPSAndCcsDQogICAgc2Nyb2xsWCA9IFRSVUUsDQogICAgZml4ZWRDb2x1bW5zID0gVFJVRQ0KICApKQ0KYGBgDQo6OjoNCjo6Og0KDQpQYXJhIHJlYWxpemFyIGVsIGFuw6FsaXNpcyBkZXNjcmlwdGl2bywgc2UgbW9kaWZpY8OzIGxhIGJhc2UgZGUgZGF0b3MgZGUgbGEgc2lndWllbnRlIG1hbmVyYToNCg0KLSAgIFNlIGVzY29naWVyb24gc29sbyBlc3R1ZGlhbnRlcyBkZSBwcmltZXIgYcOxbyBkZSAyMDIwIHkgMjAyMS4NCg0KLSAgIEZ1ZXJvbiBzZWxlY2Npb25hZGFzIGxhcyBhc2lnbmF0dXJhcyBkZSBGSVMxMDAsIEZJUzExMCwgTUFUMDIxLCBNQVQwMjIsIElXSTEzMSwgUVVJMDEwIHkgSVdHMTAxLg0KDQotICAgU2UgZmlsdHLDsyBwb3IgZXN0dWRpYW5lcyBxdWUgdHV2aWVyYW4gc3UgKipFU1RBRE8gTk9UQSoqIGNvbW8gYXByb2JhZGEgbyByZXByb2JhZGEuDQoNCi0gICBTZSBlbGltYXJvbiBjb2x1bW5hcyBxdWUgbm8gZnVlcmFuIGRlIGludGVyw6lzIHkgZnVlIHJlc3VtaWRhIGxhIGluZm9ybWFjacOzbiBkZSBjYWRhIGVzdHVkaWFudGUgZW4gdW5hIHNvbGEgb2JzZXJ2YWNpw7NuLg0KDQpMYSBiYXNlIGRlIGRhdG9zIG1vZGlmaWNhZGEgc2UgcHJlc2VudGEgYSBjb250aW51YWNpw7NuDQoNCjo6OiBwYW5lbHNldA0KPCEtLSAyMDE3LTEgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDE3LTFdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDE3XzEgPC0gcmVhZF9leGNlbCgiMjAxNy0xLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDE3XzEsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDE3LTIgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDE3LTJdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDE3XzIgPC0gcmVhZF9leGNlbCgiMjAxNy0yLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDE3XzIsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDE4LTEgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDE4LTFdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDE4XzEgPC0gcmVhZF9leGNlbCgiMjAxOC0xLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDE4XzEsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDE4LTIgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDE4LTJdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDE4XzIgPC0gcmVhZF9leGNlbCgiMjAxOC0yLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDE4XzIsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDIwLTEgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDIwLTFdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDIwXzEgPC0gcmVhZF9leGNlbCgiMjAyMC0xLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDIwXzEsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDIwLTIgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDIwLTJdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDIwXzIgPC0gcmVhZF9leGNlbCgiMjAyMC0yLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDIwXzIsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDIxLTEgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDIxLTFdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDIxXzEgPC0gcmVhZF9leGNlbCgiMjAyMS0xLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDIxXzEsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDIxLTIgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDIxLTJdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDIxXzIgPC0gcmVhZF9leGNlbCgiMjAyMS0yLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDIxXzIsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDIyLTEgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDIyLTFdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDIyXzEgPC0gcmVhZF9leGNlbCgiMjAyMi0xLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDIyXzEsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDIyLTIgTGltcGlvIC0tPg0KDQo6OjogcGFuZWwNClsyMDIyLTJdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KZGYyMDIyXzIgPC0gcmVhZF9leGNlbCgiMjAyMi0yLnhsc3giKQ0KZGF0YXRhYmxlKGhlYWQoZGYyMDIyXzIsNCksIGV4dGVuc2lvbnMgPSAnRml4ZWRDb2x1bW5zJywNCiAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAndCcsIHNjcm9sbFggPSBUUlVFLCBmaXhlZENvbHVtbnMgPSBUUlVFKSkNCg0KYGBgDQo6OjoNCjo6Og0KDQpFbCBuw7ptZXJvIGRlIGVzdHVkaWFudGVzIHByb3ZlbmllbnRlcyBkZSBjYWRhIHJlZ2nDs24gc2UgcHJlc2VudGEgZW4gbGFzIHNpZ3VpZW50ZXMgZmlndXJhcw0KDQo6OjogcGFuZWxzZXQNCjwhLS0gMjAxNyAtLT4NCg0KOjo6IHBhbmVsDQpbMjAxN117LnBhbmVsLW5hbWV9DQoNCiFbXSgyMDE3JTIwdG90YWwucG5nKQ0KOjo6DQoNCjwhLS0gMjAxOCAtLT4NCg0KOjo6IHBhbmVsDQpbMjAxOF17LnBhbmVsLW5hbWV9DQoNCiFbXSgyMDE4JTIwdG90YWwucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMCAtLT4NCg0KOjo6IHBhbmVsDQpbMjAyMF17LnBhbmVsLW5hbWV9DQoNCiFbXSgyMDIwJTIwdG90YWwucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMSAtLT4NCg0KOjo6IHBhbmVsDQpbMjAyMV17LnBhbmVsLW5hbWV9DQoNCiFbXSgyMDIxJTIwdG90YWwucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMiAtLT4NCg0KOjo6IHBhbmVsDQpbMjAyMl17LnBhbmVsLW5hbWV9DQoNCiFbXSgyMDIyJTIwdG90YWwucG5nKQ0KOjo6DQo6OjoNCg0KUG9kZW1vcyBvYnNlcnZhciBxdWUgZW4gYW1ib3MgYcOxb3MgbGEgbWF5b3LDrWEgZGUgZXN0dWRpYW50ZXMgcHJvdmllbmUgZGUgbGEgcmVnacOzbiBkZSBWYWxwYXJhw61zbyB5IE1ldHJvcG9saXRhbmEsIG1pZW50cmFzIHF1ZSBsYSByZWdpw7NuIGRlIEF5c8OpbiBwb3NlZSBsYSBtZW5vciB0YXNhIGRlIGluZ3Jlc28uIEFob3JhIGJpZW4sIGNvbnRpbnVhbmRvIGNvbiBlbCBhbsOhbGlzaXMsIGxvcyBzaWd1aWVudGVzIERvbnV0IFBsb3Qgbm9zIHBlcm1pdGVuIHZpc3VhbGl6YXIgbGEgdGFzYSBkZSBhcHJvYmFjacOzbiBwb3Igc2VtZXN0cmUgZGUgbG9zIHJhbW9zIGNsw6FzaWNvcyBkZSBwcmltZXIgYcOxbyBhY2Fkw6ltaWNvLg0KDQo6OjogcGFuZWxzZXQNCjwhLS0gMjAyMC0xIC0tPg0KDQo6OjogcGFuZWwNClsyMDIwLTFdey5wYW5lbC1uYW1lfQ0KDQohW10oMjAyMC0xJTIwZG9udXQucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMC0yIC0tPg0KDQo6OjogcGFuZWwNClsyMDIwLTJdey5wYW5lbC1uYW1lfQ0KDQohW10oMjAyMC0yJTIwZG9udXQucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMS0xIC0tPg0KDQo6OjogcGFuZWwNClsyMDIxLTFdey5wYW5lbC1uYW1lfQ0KDQohW10oMjAyMS0xJTIwZG9udXQucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMS0yIC0tPg0KDQo6OjogcGFuZWwNClsyMDIxLTJdey5wYW5lbC1uYW1lfQ0KDQohW10oMjAyMS0yJTIwZG9udXQucG5nKQ0KOjo6DQo6OjoNCg0KRW4gYmFzZSBhIGxvcyBncsOhZmljb3MgYW50ZXJpb3JlcyBwb2RlbW9zIHJlc2NhdGFyIGxhcyBzaWd1aWVudGVzIGNvbmNsdXNpb25lczoNCg0KLSAgIExhIHRhc2EgZGUgcmVwcm9iYWNpw7NuIGR1cmFudGUgbG9zIHByaW1lcm9zIHNlbWVzdHJlcyBlbiB0b2RvcyBsb3MgcmFtb3MgZXMgYmFqYS4NCg0KLSAgIER1cmFudGUgZWwgYcOxbyAyMDIwIHNlIG9idHV2aWVyb24sIGVuIGdlbmVyYWwsIG1lam9yZXMgcmVuZGltaWVudG9zIHF1ZSBlbCAyMDIxLg0KDQotICAgRklTMTEwLCBNQVQwMjIgeSBRVUkwMTAgc2UgYWRqdWRpY2Fyb24gbGEgIm1heW9yIiB0YXNhIGRlIHJlcHJvYmFjacOzbi4NCg0KLSAgIElXRzEwMSBmdWUgbGEgYXNpZ25hdHVyYSBjb24gbWVqb3IgcmVuZGltaWVudG8gZHVyYW50ZSBsb3MgcGVyaW9kb3MgYW5hbGl6YWRvcy4NCg0KLSAgIExvcyBzZW1lc3RyZXMgcGFyZXMgdHV2aWVyb24gYWx0YXMgdGFzYXMgZGUgcmVwcm9iYWNpw7NuIGVuIGFzaWduYXR1cmFzIHByb3BpYXMgZGUgcHJpbWVyIHNlbWVzdHJlIHNlZ8O6biBtYWxsYSBhY2Fkw6ltaWNhLg0KDQpFbnNlZ3VpZGEsIHVuYSBwcmVndW50YSBpbnRlcmVzYW50ZSBhIHJlc3BvbmRlciBlczogKirCv0PDs21vIHNlIHZpc3VhbGl6YW4gbGFzIG5vdGFzIGFudGVyaW9yZXMgZ2VvZ3JhZmljYW1lbnRlPyoqIFBhcmEgZWxsbyB1dGlsaXphbW9zIGVsIG1hcGEgZGUgQ2hpbGUgZXh0cmHDrWRvIGRlIEBnYWRtIHNlY2Npb25hZG8gcG9yIHJlZ2lvbmVzLiBMdWVnbywgc2Ugb2J0aWVuZW4gbGFzIHNpZ3VpZW50ZXMgZmlndXJhcw0KDQo6OjogcGFuZWxzZXQNCjwhLS0gMjAyMC0xIC0tPg0KDQo6OjogcGFuZWwNClsyMDIwLTFdey5wYW5lbC1uYW1lfQ0KDQohW10obWFwYXMlMjAyMDIwLTEucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMC0yIC0tPg0KDQo6OjogcGFuZWwNClsyMDIwLTJdey5wYW5lbC1uYW1lfQ0KDQohW10obWFwYXMlMjAyMDIwLTIucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMS0xIC0tPg0KDQo6OjogcGFuZWwNClsyMDIxLTFdey5wYW5lbC1uYW1lfQ0KDQohW10obWFwYXMlMjAyMDIxLTEucG5nKQ0KOjo6DQoNCjwhLS0gMjAyMS0yIC0tPg0KDQo6OjogcGFuZWwNClsyMDIxLTJdey5wYW5lbC1uYW1lfQ0KDQohW10obWFwYXMlMjAyMDIxLTIucG5nKQ0KOjo6DQo6OjoNCg0KRGUgbG8gYW50ZXJpb3IsIHBvZGVtb3MgZGVzcHJlbmRlciBjb25jbHVzaW9uZXMgcXVlIGFudGVzIG5vIHBvc2XDrWFtb3M6DQoNCi0gICBMYSBncmFuIG1heW9yw61hIGRlIHJlZ2lvbmVzIGFwcm9iw7MgY29uIG5vdGFzIHN1cGVyaW9yZXMgYSA3MCBlbiBwcm9tZWRpby4NCg0KLSAgIExhIHpvbmEgbm9ydGUgZGUgQ2hpbGUgb2J0dXZvIGxvcyByZW5kaW1pZW50b3MsIGVuIHByb21lZGlvLCBtw6FzIGRlc2NlbmRpZG9zLg0KDQotICAgTGFzIHJlZ2lvbmVzIHByb3ZlbmllbnRlcyBkZSBsYSB6b25hIHN1ciBkZSBDaGlsZSBvYnR1dmllcm9uIGxvcyByZW5kaW1pZW50b3MgbcOhcyBhbHRvcy4NCg0KLSAgIExhIGFzaWduYXR1cmEgcXVlLCBlbiBwcm9tZWRpbywgdHV2byBsb3MgcmVuZGltaWVudG9zIG3DoXMgYmFqb3MgZnVlcm9uIFFVSTAxMCB5IEZJUzExMC4NCg0KIyMgQXV0b2NvcnJlbGFjacOzbiBlc3BhY2lhbDogw41uZGljZSBkZSBNb3Jhbg0KDQpEYWRhcyBsYXMgb2JzZXJ2YWNpb25lcyAkWV8xLFxsZG90cyxZX24kIGFzb2NpYWRhcyBhIHVuYSBzZWN1ZW5jaWEgZXNwYWNpYWwgLCBAbW9yYW4xOTUwbm90ZXMgcHJvcHVzbyBlbCBzaWd1aWVudGUgZXN0YWTDrXN0aWNvIHBhcmEgbWVkaXIgbGEgcHJlc2VuY2lhIGRlIGF1dG9jb3JyZWxhY2nDs24gZGUgdW5hIHNlY3VlbmNpYSBlc3BhY2lhbA0KDQokJEk9XGZyYWN7biBcc3VtX2kgXHN1bV9qIHdfe2kgan1cbGVmdChZX2ktXGJhcntZfVxyaWdodClcbGVmdChZX2otXGJhcntZfVxyaWdodCl9e1xsZWZ0KFxzdW1fe2kgXG5lcSBqfSB3X3tpIGp9XHJpZ2h0KSBcc3VtX2lcbGVmdChZX2ktXGJhcntZfVxyaWdodCleMn0kJCBkb25kZSAkd197aWp9JCBzb24gcGVzb3MgZXNwYWNpYWxlcyBlbnRyZSBsb3Mgc2l0aW9zIHkgJFxiYXJ7WX0kIGRlbm90YSBlbCBwcm9tZWRpbyBkZSBsYXMgb2JzZXJ2YWNpb25lcy4gQmFqbyBub3JtYWxpZGFkIHkgYXN1bWllbmRvIG1lZGlhIGNvbnN0YW50ZSBkZWwgcHJvY2Vzbywgc2UgdGllbmUgcXVlICRcbWF0aGJie0V9W0ldPS1cZnJhY3sxfXtuLTF9JC4gRW4gbGEgcHLDoWN0aWNhLCBzZSBjb25zaWRlcmEgcXVlDQoNCi0gICBTaSAkST5cbWF0aGJie0V9W0ldJCwgZW50b25jZXMgdW4gc2l0aW8gdGllbmRlIGEgY29uZWN0YXJzZSBhIGxvcyBzaXRpb3MgcXVlIHRpZW5lIHNpbWlsYXJlcyBhdHJpYnV0b3MuIExhIGNvcnJlbGFjacOzbiBlc3BhY2lhbCBlcyBwb3NpdGl2YSB5IGF1bWVudGEgYSBtZWRpZGEgcXVlIGVsIHZhbG9yICR8SS1cbWF0aGJie0V9W0ldfCQgbG8gaGFjZS4NCg0KLSAgIFNpICRJPFxtYXRoYmJ7RX1bSV0kLCBsb3MgdmFsb3JlcyBkZSBzaXRpb3MgY29uZWN0YWRvcyBhIHVuIHNpdGlvIGVuIHBhcnRpY3VsYXIgdGllbmRlbiBhIHNlciBkaXNpbWlsZXMgbyBkaWZlcmVudGVzLg0KDQojIyBNb2RlbG9zIENBUiB1bml2YXJpYWRvcyB5IG11bHRpdmFyaWFkb3MNCg0KVW4gbW9kZWxvIENBUiAoQ29uZGl0aW9uYWwgQXV0b3JlZ3Jlc3NpdmUpIGVzIHVuIHRpcG8gZGUgbW9kZWxvIGVzdGFkw61zdGljbyB1dGlsaXphZG8gcGFyYSBhbmFsaXphciBkYXRvcyBlc3BhY2lhbGVzLiBTZSB1c2EgZnJlY3VlbnRlbWVudGUgcGFyYSBtb2RlbGFyIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgb2JzZXJ2YWNpb25lcyBkZSB1bmEgdmFyaWFibGUgZW4gZGlmZXJlbnRlcyBsdWdhcmVzIGdlb2dyw6FmaWNvcy4gRWwgbW9kZWxvIGFzdW1lIHF1ZSBsYSB2YXJpYWJsZSBlbiBjYWRhIHB1bnRvIGVzdMOhIHJlbGFjaW9uYWRhIGNvbiBsYXMgdmFyaWFibGVzIGVuIGxvcyBwdW50b3MgdmVjaW5vcywgeSBzZSB1dGlsaXphIHBhcmEgZ2VuZXJhciBwcmVkaWNjaW9uZXMgcGFyYSBwdW50b3Mgc2luIGRhdG9zLiBBIHBlc2FyIGRlIHF1ZSBoYXlhbiBzaWRvIGludHJvZHVjaWRvcyBoYWNlIGTDqWNhZGFzIGF0cmFzIHBvciBAYmVzYWcxOTc0c3BhdGlhbC4gSGFuIHRvbWFkbyBtYXlvciByZWxldmFuY2lhIHBvciBzdSBhcGxpY2FjacOzbiBlbiB0ZW1hcyBpbmdlbmllcmlsZXMgeSBtw6lkaWNvcy4NCg0KUGFyYSBlbCBjYXNvIEdhdXNzaWFubywgZGFkYXMgbGFzIGNvbXBvbmVudGVzIGVzcGFjaWFsICRce1xtYXRoYmZ7c31faVx9X3tpPTF9Xm4kLCBhc29jaWFtb3MgdW4gZWZlY3RvIGVzcGFjaWFsIGxhdGVudGUgJFx7XHBoaShcbWF0aGJme3N9X2kpXH1fe2k9MX1ebiQuIEVsIG1vZGVsbyBDQVIgc2UgZm9ybXVsYSBhIHBhcnRpciBkZSBzdXMgZGlzdHJpYnVjaW9uZXMgZnVsbCBjb25kaWNpb25hZGFzIGNvbW8NCg0KJCRccGhpX2kgXG1pZCBccGhpX2osIGogXG5lcSBpIFxzaW0gTlxsZWZ0KFxzdW1fe2o9MX1ee259IGNfe2lqfXlfaiwgXHNpZ21hX2leMlxyaWdodCkuJCQgZG9uZGUgJFxzaWdtYV9pJCBlcyB1biBwYXLDoW1ldHJvIGRlIGNvdmFyaWFuemEgZXNwYWNpYWwgeSAkXG1hdGhiZntDfT1ce2Nfe2lqfVx9JCBlcyB1bmEgbWF0cml6ICRuXHRpbWVzIG4kIGFzb2NpYWRhIGNvbiBsYXMgY29tcG9uZW50ZXMgZXNwYWNpYWxlcy4NCg0KU2kgZGVmaW5pbW9zICRcbWF0aGJme019PVx0ZXh0e2RpYWd9KFxzaWdtYV8xXjIsXGxkb3RzLFxzaWdtYV9uXjIpJC4gQmFqbyBsYSBjb25kaWNpw7NuIGRlIHNpbWV0csOtYSBkZSAkXG1hdGhiZntNfV57LTF9XG1hdGhiZntDfSQgeSBxdWUgJFxtYXRoYmZ7TX1eey0xfShcbWF0aGJme0l9X24tXG1hdGhiZntDfSkkIHNlYSBkZWZpbmlkYSBwb3NpdGl2YSBbQGNyZXNzaWUxOTkzc3RhdGlzdGljc10sIGxhIGRpc3RyaWJ1Y2nDs24gY29uanVudGEgZGUgJFxib2xkc3ltYm9se1xwaGl9JCBlc3TDoSBiaWVuIGRlZmluaWRhIGNvbW8NCg0KJCRcYm9sZHN5bWJvbHtccGhpfVxzaW0gTihcbWF0aGJmezB9LFxtYXRoYmZ7XFNpZ21hfV97XHRleHR7Q0FSfX0pJCQgZG9uZGUgJFxtYXRoYmZ7XFNpZ21hfV97XHRleHR7Q0FSfX09KFxtYXRoYmZ7SX1fbi1cbWF0aGJme0N9KV57LTF9XG1hdGhiZntNfSQuDQoNClVzdWFsbWVudGUsIGVzIGNvbnNpZGVyYWRvIHF1ZSAkXG1hdGhiZntDfT1ccmhvXG1hdGhiZntXfSQgeSAkXG1hdGhiZntNfT1cc2lnbWFeMlxtYXRoYmZ7SX1fbiQsIGRvbmRlICRcYm9sZHN5bWJvbHtXfSQgZXMgdW5hIG1hdHJpeiBkZSBwZXNvcyBlc3BhY2lhbGVzLCAkXHJobyQgZXMgdW4gcGFyw6FtZXRybyBkZSBzdWF2aXphbWllbnRvIHkgJFxtYXRoYmZ7XFNpZ21hfV97XHRleHR7Q0FSfX09XHNpZ21hXjJcbGVmdChcbWF0aGJme0l9X24tXHJobyBcbWF0aGJme1d9XHJpZ2h0KV57LTF9JCBzaSAkXG1hdGhiZntXfSQgZXMgc2ltw6l0cmljYS4gTcOhcyBhw7puLCBzaSAkXG1hdGhiZntXfSQgZXMgYWRlbcOhcyBlc3RhbmRhcml6YSBwb3IgZmlsYSwgJFxtYXRoYmZ7XFNpZ21hfV97XHRleHR7Q0FSfX09XHNpZ21hXjIoXG1hdGhiZntEfS1ccmhvIFxtYXRoYmZ7V30pXnstMX0kLCBkb25kZSAkXG1hdGhiZntEfT1cdGV4dHtkaWFnfShcbWF0aGJme1d9X3sxK30sXGxkb3RzLFxtYXRoYmZ7V31fe24rfSkkIHkgJFxtYXRoYmZ7V31fe2krfSQgZXMgbGEgc3VtYSBkZSBsb3MgZWxlbWVudG9zIGRlIGxhICRpJC3DqXNpbWEgZmlsYSBkZSBsYSBtYXRyaXogJFxtYXRoYmZ7V30kIHBhcmEgY2FkYSAkaT0xLFxsZG90cyxuJC4NCg0KQGJhbmVyamVlMjAwM2hpZXJhcmNoaWNhbCBleHRlbmRpZXJvbiBlbCBtb2RlbG8gYW50ZXJpb3IgYSB1bm8gZnVsbCBjb25kaWNpb25hZG8gY29uc2lkZXJhbmRvICRcYm9sZHN5bWJvbHtccGhpfV57XHRvcH09KFxib2xkc3ltYm9se1xwaGl9XzEsXGxkb3RzLFxib2xkc3ltYm9se1xwaGl9X24pJCwgZG9uZGUgY2FkYSAkXGJvbGRzeW1ib2x7XHBoaX1faT0oXHBoaV97aTF9LFxsZG90cyxccGhpX3tpcH0pXntcdG9wfVxpblxtYXRoYmJ7Un1ee3B9JC4gQXPDrSwgbGEgZGlzdHJpYnVjacOzbiBjb25qdW50YSBlc3TDoSBkZWZpbmlkYSBjb21vDQoNCiQkXGJvbGRzeW1ib2x7XHBoaX1cc2ltIE4oXG1hdGhiZnswfSxcbWF0aGJme1xTaWdtYX1fe1x0ZXh0e01DQVJ9fSkkJCBkb25kZSAkXG1hdGhiZntcU2lnbWF9X3tcdGV4dHtNQ0FSfX09XExhbWJkYVxvdGltZXMoXG1hdGhiZntEfS1ccmhvXG1hdGhiZntXfSleey0xfSQgeSAkXExhbWJkYSQgZXMgdW5hIG1hdHJpeiBkZSBjb3ZhcmlhbnphIGRlZmluaWRhIHBvc2l0aXZhIHF1ZSBhanVzdGEgbGEgY29ycmVsYWNpw7NuIG5vIGVzcGFjaWFsIGVudHJlIHZhcmlhYmxlcyBlbiBjdWFscXVpZXIgcmVnacOzbiAkXG1hdGhiZntzfV9pJCwgcGFyYSAkaT0xLFxsZG90cyxuJC4NCg0KRGl2ZXJzYXMgdmFyaWFjaW9uZXMgaGEgdGVuaWRvIGVsIG1vZGVsby4gQExlcm91eDIwMDBFc3RpbWF0aW9uT0QgcHJvcHVzaWVyb24gdW5hIGRpc3RyaWJ1Y2nDs24gY29uanVudGEgKGJham8gbG9zIHN1cHVlc3RvcyBhZGVjdWFkb3MpIGRlIGxvcyBlZmVjdG9zIGVzcGFjaWFsZXMgZGFkYSBwb3IgJCRcYm9sZHN5bWJvbHtccGhpfSBcc2ltIFxtYXRocm17Tn1cbGVmdChcbWF0aGJmezB9LFxsZWZ0W1xtYXRoYmZ7UX0oXG1hdGhiZntXfSwgXHJobykgXG90aW1lcyBcbWF0aGJme1xTaWdtYX1eey0xfVxyaWdodF1eey0xfVxyaWdodCkkJCBBcXXDrSAkXG1hdGhiZntRfShcbWF0aGJme1d9LCBccmhvKT1ccmhvW1xvcGVyYXRvcm5hbWV7ZGlhZ30oXG1hdGhiZntXfSBcbWF0aGJmezF9KS1cbWF0aGJme1d9XSsoMS1ccmhvKSBcbWF0aGJme0l9JCBlcyBsYSBtYXRyaXogZGUgcHJlY2lzacOzbiwgbWllbnRyYXMgcXVlICRcbWF0aGJme1xTaWdtYX0kIGVzIHVuYSBtYXRyaXogZGUgY292YXJpYW56YSBjcnV6YWRhIGVudHJlIGxhcyB2YXJpYWJsZXMuDQoNCiMjIEltcGxlbWVudGFjacOzbg0KDQpQYXJhIGxhIGFwbGljYWNpw7NuIHNlIHV0aWxpesOzICRcdGV4dHR0e1J9JCBzaWd1aWVuZG8gbG9zIGxpbmVhbWllbnRvcyBwcmVzZW50ZXMgZW4gQGJhbmVyamVlMjAwM2hpZXJhcmNoaWNhbC4gRWwgw61uZGljZSBkZSBNb3LDoW4gc2UgZW5jdWVudHJhIGVuIGxhIGxpYnJlcsOtYSAkXHRleHR0dHtzcGRlcH0kIHkgbGEgaW1wbGVtZW50YWNpw7NuIGRlbCBtb2RlbG8gTUNBUiBzZXLDoSBhIHRyYXbDqXMgZGUgdW4gbWFyY28gYmF5ZXNpYW5vIGRlYmlkbyBhIGxhIGVzdHJ1Y3R1cmEgY29uZGljaW9uYWwgZXhwbMOtY2l0YSwgY29tbyBzZcOxYWxhbiBAR2VsZmFuZDIwMDNQcm9wZXJNQy4gUGFyYSBlbGxvLCB1dGlsaXphcmVtb3MgbGEgbGlicmVyw61hICRcdGV4dHR0e0NBUkJheWVzfSQgW0BDQVJCYXllc10uIFNlIGFqdXN0w7MgdW4gbW9kZWxvIGxpbmVhbCBzdXBvbmllbmRvIHF1ZSAkWV97a2p9XHNpbSBOKFxtdV97a2p9LFxzaWdtYV9qXjIpJCB5ICRcbXVfe2tqfT1cbWF0aGJme3h9X2tee1x0b3B9XGJvbGRzeW1ib2x7XGJldGF9X2orXHBoaV97a2p9JCwgZG9uZGUgbG9zIGVmZWN0b3MgYWxlYXRvcmlvcyBlc3BhY2lhbGVzIHNpZ3VlbiBsYSBlc3RydWN0dXJhIE1DQVIgZGUgTGVyb3V4Lg0KDQojIyBBcGxpY2FjacOzbiBlbiBsYSByZWdpb24gZGUgVmFscGFyYcOtc28NCg0KRGFkYSBsYSBwb2NhIGNhbnRpZGFkIGRlIGRhdG9zIHBhcmEgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGRlIGNhcmFjdGVyIG5hY2lvbmFsLCBub3MgY2VudHJhcmVtb3MgZW4gbGEgcmVnacOzbiBkZSBWYWxwYXJhw61zbyB5IHN1cyBjb211bmFzLiBBcGxpY2FyZW1vcyBlbCBtb2RlbG8gbGluZWFsIGFudGVyaW9yIHVzYW5kbyBjb21vIHZhcmlhYmxlcyBleHBsaWNhdGl2YXM6DQoNCjEuICDDjW5kaWNlIGRlIHBvYnJlemEgW0Bwb2JyZXphaW5kZXhdIGFqdXN0YWRvIHVzYW5kbyBsYSBtZXRvZG9sb2fDrWEgZGUgw6FyZWFzIHBlcXVlw7FhcyAoU0FFLCBwb3Igc3Ugc2lnbGEgZW4gaW5nbMOpcykuIFNlIGVuY2FyZ2EgZGUgbWVkaXIgZWwgcG9yY2VudGFqZSBkZSBwZXJzb25hcyBlbiBzaXR1YWNpw7NuIGRlIHBvYnJlemEgcG9yIGluZ3Jlc29zLg0KDQoyLiAgw41uZGljZSBkZSBkZXNhcnJvbGxvIGNvbXVuYWwgW0BkZXNhcnJvbGxvaW5kZXhdIHF1ZSBvdG9yZ2EgdW4gcHVudGFqZSBhIGxhcyBjb211bmFzIGRlIENoaWxlIHF1ZSB2YXLDrWEgZW50cmUgMCB5IDEgc2Vnw7puIHN1cyBjb25kaWNpb25lcyBlY29uw7NtaWNhcywgZWR1Y2F0aXZhcyB5IGRlIHNhbHVkLg0KDQozLiAgUHVudGFqZSBQU1UgMjAxNyBwb3IgY29tdW5hcyBkZSBsYSByZWdpw7NuIHF1ZSBhbmFsaXphIGVsIHByb21lZGlvIGRlIGxhcyBwcnVlYmFzIGRlIG1hdGVtw6F0aWNhcyB5IGxlbmd1YWplIC4NCg0KNC4gIFRhc2EgZGUgY29sZWdpb3MgcGFydGljdWxhcmVzIHBvciBuw7ptZXJvIHRvdGFsIGRlIGVzdGFibGVjaW1pZW50b3MgZWR1Y2FjaW9uYWxlcywgZXN0byBmdWUgY2FsY3VsYWRvIHVzYW5kbyBkYXRvcyBvZmljaWFsZXMgZGUgbGEgYmlibGlvdGVjYSBkZWwgY29uZ3Jlc28gbmFjaW9uYWwgZGUgQ2hpbGUuDQoNCkdyYWZpY2FtZW50ZSBsbyBhbnRlcmlvciBzZSB2aXN1YWxpemEgZW4gbGEgc2lndWllbnRlIGZpZ3VyYQ0KDQo6OjogcGFuZWxzZXQNCjwhLS0gSURQIC0tPg0KDQo6OjogcGFuZWwNCltJRFBdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQoNCmluZGljZXMgPC0gcmVhZF9leGNlbCgicG9icmV6YSB2YWxwby54bHN4IikNCg0KaW5kaWNlcyRDb211bmEgPC0gdG91cHBlcihpbmRpY2VzJENvbXVuYSkNCmluZGljZXMkQ29tdW5hIDwtIGNoYXJ0cigiw6DDqMOsw7LDucOAw4jDjMOSw5nDocOpw63Ds8O6w4HDicONw5PDmiIsICJhZWlvdUFFSU9VYWVpb3VBRUlPVSIsIGluZGljZXMkQ29tdW5hKQ0KDQpjb2xuYW1lcyhpbmRpY2VzKVszXTwtICJJRFAiDQpjb2xuYW1lcyhpbmRpY2VzKVs0XTwtICJJREMiDQpjb2xuYW1lcyhpbmRpY2VzKVs1XTwtICJSQ1AiDQpjb2xuYW1lcyhpbmRpY2VzKVs2XTwtICJQUEMiDQoNCmdhZG1fdmFscF9jb20gPC0gdmVjdChyZWFkUkRTKCJnYWRtNDFfQ0hMXzNfcGsucmRzIikpICU+JQ0KICBzdF9hc19zZigpICU+JQ0KICBmaWx0ZXIoTkFNRV8xID09ICJWYWxwYXJhw61zbyIpDQoNCmdhZG1fdmFscF9jb20kTkFNRV8zIDwtIHRvdXBwZXIoZ2FkbV92YWxwX2NvbSROQU1FXzMpDQpnYWRtX3ZhbHBfY29tJE5BTUVfMyA8LSBjaGFydHIoIsOgw6jDrMOyw7nDgMOIw4zDksOZw6HDqcOtw7PDusOBw4nDjcOTw5oiLCAiYWVpb3VBRUlPVWFlaW91QUVJT1UiLCBnYWRtX3ZhbHBfY29tJE5BTUVfMykNCmdhZG1fdmFscF9jb20kTkFNRV8zIDwtIGdzdWIoIi0iLCAiICIsIGdhZG1fdmFscF9jb20kTkFNRV8zKQ0KZ2FkbV92YWxwX2NvbSA8LSBnYWRtX3ZhbHBfY29tWy1jKDEpLCBdICNRdWl0YXIgSXNsYSBkZSBQYXNjdWENCmdhZG1fdmFscF9jb20gPC0gc3Vic2V0KGdhZG1fdmFscF9jb20sIE5BTUVfMyAhPSAiSlVBTiBGRVJOQU5ERVoiKQ0KZ2FkbV92YWxwX2NvbSROQU1FXzNbMTRdIDwtICJMQSBDQUxFUkEiDQpnYWRtX3ZhbHBfY29tJE5BTUVfM1syNl0gPC0gIkxMQVkgTExBWSINCg0KY29sX2F1eCA8LSByZXAoTkEsbGVuZ3RoKGdhZG1fdmFscF9jb20kTkFNRV8zKSkNCg0KcHJvbV9jb21fdmFscCA8LSBkYXRhLmZyYW1lKGdhZG1fdmFscF9jb20kTkFNRV8zLCBjb2xfYXV4LCBjb2xfYXV4LCBjb2xfYXV4LCBjb2xfYXV4LCBjb2xfYXV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9hdXgsIGNvbF9hdXgsIGNvbF9hdXgsIGNvbF9hdXgpDQpuYW1lcyhwcm9tX2NvbV92YWxwKSA8LSBjKCJDb211bmEiLCAiRklTMTEwIiwgIklXSTEzMSIsICJNQVQwMjEiLCAiTUFUMDIyIiwiUVVJMDEwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIklEUCIsICJJREMiLCAiUkNQIiwgIlBQQyIpDQoNCmZvciAoaSBpbiAxOmxlbmd0aChpbmRpY2VzJENvbXVuYSkpew0KICBJRFAgPC0gc3Vic2V0KGluZGljZXMsIENvbXVuYSA9PSBpbmRpY2VzJENvbXVuYVtpXSkkSURQDQogIElEQyA8LSBzdWJzZXQoaW5kaWNlcywgQ29tdW5hID09IGluZGljZXMkQ29tdW5hW2ldKSRJREMNCiAgUkNQIDwtIHN1YnNldChpbmRpY2VzLCBDb211bmEgPT0gaW5kaWNlcyRDb211bmFbaV0pJFJDUA0KICBQUEMgPC0gc3Vic2V0KGluZGljZXMsIENvbXVuYSA9PSBpbmRpY2VzJENvbXVuYVtpXSkkUFBDDQogIHJvd19pbmRleCA8LSB3aGljaChwcm9tX2NvbV92YWxwJENvbXVuYSA9PSBpbmRpY2VzJENvbXVuYVtpXSkNCiAgcHJvbV9jb21fdmFscFtyb3dfaW5kZXgsICJJRFAiXSA8LSBhcy5udW1lcmljKElEUCkNCiAgcHJvbV9jb21fdmFscFtyb3dfaW5kZXgsICJJREMiXSA8LSBhcy5udW1lcmljKElEQykNCiAgcHJvbV9jb21fdmFscFtyb3dfaW5kZXgsICJSQ1AiXSA8LSBhcy5udW1lcmljKFJDUCkNCiAgcHJvbV9jb21fdmFscFtyb3dfaW5kZXgsICJQUEMiXSA8LSBhcy5udW1lcmljKFBQQykNCn0NCg0KcHJvbV9jb21fdmFscCA8LSBwcm9tX2NvbV92YWxwICU+JSBtdXRhdGVfYWxsKH5pZmVsc2UoaXMubmFuKC4pLCBOQSwgLikpDQoNCmdhZG1fdmFscF9jb20kSURQIDwtIHByb21fY29tX3ZhbHAkSURQDQpnYWRtX3ZhbHBfY29tJElEQyA8LSBwcm9tX2NvbV92YWxwJElEQw0KZ2FkbV92YWxwX2NvbSRSQ1AgPC0gcHJvbV9jb21fdmFscCRSQ1ANCmdhZG1fdmFscF9jb20kUFBDIDwtIHByb21fY29tX3ZhbHAkUFBDDQoNCmdhZG1fdmFscF9jb20gPC0gc3RfdHJhbnNmb3JtKHg9Z2FkbV92YWxwX2NvbSwNCiAgICAgICAgICAgICAgICBjcnM9Jytwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0ICtub19kZWZzJykNCg0KY29sb3VycyA8LSBjb2xvck51bWVyaWMocGFsZXR0ZSA9ICJZbE9yUmQiLCBkb21haW4gPSBnYWRtX3ZhbHBfY29tJElEUCkNCm1hcDEgPC0gbGVhZmxldChkYXRhPWdhZG1fdmFscF9jb20pICU+JQ0KICAgICAgICBhZGRUaWxlcygpICU+JQ0KICAgICAgICBhZGRQb2x5Z29ucyhmaWxsQ29sb3IgPSB+Y29sb3VycyhJRFApLCBjb2xvcj0iZ3JleSIsIHdlaWdodD0xLA0KICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywgDQogICAgICAgIGxhYmVsID0gfnBhc3RlKGdhZG1fdmFscF9jb20kTkFNRV8zLCBnYWRtX3ZhbHBfY29tJElEUCksDQogICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKA0KICAgICAgICAgIHdlaWdodCA9IDUsDQogICAgICAgICAgY29sb3IgPSAiZ3JleSIsDQogICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjcsDQogICAgICAgICAgYnJpbmdUb0Zyb250ID0gVFJVRSksDQogICAgICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucygNCiAgICAgICAgICBzdHlsZSA9IGxpc3QoImZvbnQtd2VpZ2h0IiA9ICJub3JtYWwiLCBwYWRkaW5nID0gIjNweCA4cHgiKSwNCiAgICAgICAgICB0ZXh0c2l6ZSA9ICIxNXB4IiwNCiAgICAgICAgICBkaXJlY3Rpb24gPSAiYXV0byIpKSAlPiUNCiAgICAgICAgYWRkTGVnZW5kKHBhbCA9IGNvbG91cnMsIHZhbHVlcyA9IGdhZG1fdmFscF9jb20kSURQLCBvcGFjaXR5ID0gMSwNCiAgICAgICAgdGl0bGU9IklEUCIpICU+JQ0KICAgICAgICBhZGRTY2FsZUJhcihwb3NpdGlvbj0iYm90dG9tbGVmdCIpDQptYXAxDQoNCmBgYA0KOjo6DQoNCjwhLS0gSURDIC0tPg0KDQo6OjogcGFuZWwNCltJRENdey5wYW5lbC1uYW1lfQ0KDQpgYGB7ciwgZmlnLmFsaWduPSJjZW50ZXIiLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KDQpjb2xvdXJzIDwtIGNvbG9yTnVtZXJpYyhwYWxldHRlID0gIllsT3JSZCIsIGRvbWFpbiA9IGdhZG1fdmFscF9jb20kSURDKQ0KbWFwMiA8LSBsZWFmbGV0KGRhdGE9Z2FkbV92YWxwX2NvbSkgJT4lDQogICAgICAgIGFkZFRpbGVzKCkgJT4lDQogICAgICAgIGFkZFBvbHlnb25zKGZpbGxDb2xvciA9IH5jb2xvdXJzKElEQyksIGNvbG9yPSJncmV5Iiwgd2VpZ2h0PTEsDQogICAgICAgIGZpbGxPcGFjaXR5ID0gMC43LCANCiAgICAgICAgbGFiZWwgPSB+cGFzdGUoZ2FkbV92YWxwX2NvbSROQU1FXzMsIGdhZG1fdmFscF9jb20kSURDKSwNCiAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoDQogICAgICAgICAgd2VpZ2h0ID0gNSwNCiAgICAgICAgICBjb2xvciA9ICJncmV5IiwNCiAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywNCiAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwNCiAgICAgICAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKA0KICAgICAgICAgIHN0eWxlID0gbGlzdCgiZm9udC13ZWlnaHQiID0gIm5vcm1hbCIsIHBhZGRpbmcgPSAiM3B4IDhweCIpLA0KICAgICAgICAgIHRleHRzaXplID0gIjE1cHgiLA0KICAgICAgICAgIGRpcmVjdGlvbiA9ICJhdXRvIikpICU+JQ0KICAgICAgICBhZGRMZWdlbmQocGFsID0gY29sb3VycywgdmFsdWVzID0gZ2FkbV92YWxwX2NvbSRJREMsIG9wYWNpdHkgPSAxLA0KICAgICAgICB0aXRsZT0iSURDIikgJT4lDQogICAgICAgIGFkZFNjYWxlQmFyKHBvc2l0aW9uPSJib3R0b21sZWZ0IikNCm1hcDINCg0KYGBgDQo6OjoNCg0KPCEtLSAyMDIxLTEgLS0+DQoNCjo6OiBwYW5lbA0KW1BQQ117LnBhbmVsLW5hbWV9DQoNCmBgYHtyLCBmaWcuYWxpZ249ImNlbnRlciIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQoNCmNvbG91cnMgPC0gY29sb3JOdW1lcmljKHBhbGV0dGUgPSAiWWxPclJkIiwgZG9tYWluID0gZ2FkbV92YWxwX2NvbSRQUEMpDQptYXAzIDwtIGxlYWZsZXQoZGF0YT1nYWRtX3ZhbHBfY29tKSAlPiUNCiAgICAgICAgYWRkVGlsZXMoKSAlPiUNCiAgICAgICAgYWRkUG9seWdvbnMoZmlsbENvbG9yID0gfmNvbG91cnMoUFBDKSwgY29sb3I9ImdyZXkiLCB3ZWlnaHQ9MSwNCiAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjcsIA0KICAgICAgICBsYWJlbCA9IH5wYXN0ZShnYWRtX3ZhbHBfY29tJE5BTUVfMywgZ2FkbV92YWxwX2NvbSRQUEMpLA0KICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucygNCiAgICAgICAgICB3ZWlnaHQgPSA1LA0KICAgICAgICAgIGNvbG9yID0gImdyZXkiLA0KICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC43LA0KICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLA0KICAgICAgICBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMoDQogICAgICAgICAgc3R5bGUgPSBsaXN0KCJmb250LXdlaWdodCIgPSAibm9ybWFsIiwgcGFkZGluZyA9ICIzcHggOHB4IiksDQogICAgICAgICAgdGV4dHNpemUgPSAiMTVweCIsDQogICAgICAgICAgZGlyZWN0aW9uID0gImF1dG8iKSkgJT4lDQogICAgICAgIGFkZExlZ2VuZChwYWwgPSBjb2xvdXJzLCB2YWx1ZXMgPSBnYWRtX3ZhbHBfY29tJFBQQywgb3BhY2l0eSA9IDEsDQogICAgICAgIHRpdGxlPSJQUEMiKSAlPiUNCiAgICAgICAgYWRkU2NhbGVCYXIocG9zaXRpb249ImJvdHRvbWxlZnQiKQ0KbWFwMw0KDQpgYGANCjo6Og0KDQo8IS0tIFRDUCAtLT4NCg0KOjo6IHBhbmVsDQpbVENQXXsucGFuZWwtbmFtZX0NCg0KYGBge3IsIGZpZy5hbGlnbj0iY2VudGVyIiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCg0KY29sb3VycyA8LSBjb2xvck51bWVyaWMocGFsZXR0ZSA9ICJZbE9yUmQiLCBkb21haW4gPSBnYWRtX3ZhbHBfY29tJFJDUCkNCm1hcDQgPC0gbGVhZmxldChkYXRhPWdhZG1fdmFscF9jb20pICU+JQ0KICAgICAgICBhZGRUaWxlcygpICU+JQ0KICAgICAgICBhZGRQb2x5Z29ucyhmaWxsQ29sb3IgPSB+Y29sb3VycyhSQ1ApLCBjb2xvcj0iZ3JleSIsIHdlaWdodD0xLA0KICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywgDQogICAgICAgIGxhYmVsID0gfnBhc3RlKGdhZG1fdmFscF9jb20kTkFNRV8zLCBnYWRtX3ZhbHBfY29tJFJDUCksDQogICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKA0KICAgICAgICAgIHdlaWdodCA9IDUsDQogICAgICAgICAgY29sb3IgPSAiZ3JleSIsDQogICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjcsDQogICAgICAgICAgYnJpbmdUb0Zyb250ID0gVFJVRSksDQogICAgICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucygNCiAgICAgICAgICBzdHlsZSA9IGxpc3QoImZvbnQtd2VpZ2h0IiA9ICJub3JtYWwiLCBwYWRkaW5nID0gIjNweCA4cHgiKSwNCiAgICAgICAgICB0ZXh0c2l6ZSA9ICIxNXB4IiwNCiAgICAgICAgICBkaXJlY3Rpb24gPSAiYXV0byIpKSAlPiUNCiAgICAgICAgYWRkTGVnZW5kKHBhbCA9IGNvbG91cnMsIHZhbHVlcyA9IGdhZG1fdmFscF9jb20kUkNQLCBvcGFjaXR5ID0gMSwNCiAgICAgICAgdGl0bGU9IlJDUCIpICU+JQ0KICAgICAgICBhZGRTY2FsZUJhcihwb3NpdGlvbj0iYm90dG9tbGVmdCIpDQptYXA0DQpgYGANCjo6Og0KOjo6DQoNCkhBU1RBIEFDQSBzYWtzYWtzYW5rYXNrbnNha25zYQ0KDQo6OjogeyN2aXoxNjc0MjM2OTk4NjMyIC50YWJsZWF1UGxhY2Vob2xkZXIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZSJ9DQo8bm9zY3JpcHQ+PGEgaHJlZj0nIyc+PGltZyBzcmM9Imh0dHBzOi8vcHVibGljLnRhYmxlYXUuY29tL3N0YXRpYy9pbWFnZXMvTWEvTWFwYXNfMTY3NDIzNjQ2Mzc2ODAvRGFzaGJvYXJkMS8xX3Jzcy5wbmciIGFsdD0iRGFzaGJvYXJkIDEgIiBzdHlsZT0iYm9yZGVyOiBub25lIi8+PC9hPjwvbm9zY3JpcHQ+DQoNCjxvYmplY3QgY2xhc3M9InRhYmxlYXVWaXoiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4NCg0KPHBhcmFtIG5hbWU9J2hvc3RfdXJsJyB2YWx1ZT0naHR0cHMlM0ElMkYlMkZwdWJsaWMudGFibGVhdS5jb20lMkYnIC8+IDxwYXJhbSBuYW1lPSdlbWJlZF9jb2RlX3ZlcnNpb24nIHZhbHVlPSczJyAvPiA8cGFyYW0gbmFtZT0nc2l0ZV9yb290JyB2YWx1ZT0nJyAvPjxwYXJhbSBuYW1lPSduYW1lJyB2YWx1ZT0nTWFwYXNfMTY3NDIzNjQ2Mzc2ODAmIzQ3O0Rhc2hib2FyZDEnIC8+PHBhcmFtIG5hbWU9J3RhYnMnIHZhbHVlPSdubycgLz48cGFyYW0gbmFtZT0ndG9vbGJhcicgdmFsdWU9J3llcycgLz48cGFyYW0gbmFtZT0nc3RhdGljX2ltYWdlJyB2YWx1ZT0naHR0cHM6JiM0NzsmIzQ3O3B1YmxpYy50YWJsZWF1LmNvbSYjNDc7c3RhdGljJiM0NztpbWFnZXMmIzQ3O01hJiM0NztNYXBhc18xNjc0MjM2NDYzNzY4MCYjNDc7RGFzaGJvYXJkMSYjNDc7MS5wbmcnIC8+IDxwYXJhbSBuYW1lPSdhbmltYXRlX3RyYW5zaXRpb24nIHZhbHVlPSd5ZXMnIC8+PHBhcmFtIG5hbWU9J2Rpc3BsYXlfc3RhdGljX2ltYWdlJyB2YWx1ZT0neWVzJyAvPjxwYXJhbSBuYW1lPSdkaXNwbGF5X3NwaW5uZXInIHZhbHVlPSd5ZXMnIC8+PHBhcmFtIG5hbWU9J2Rpc3BsYXlfb3ZlcmxheScgdmFsdWU9J3llcycgLz48cGFyYW0gbmFtZT0nZGlzcGxheV9jb3VudCcgdmFsdWU9J3llcycgLz48cGFyYW0gbmFtZT0nbGFuZ3VhZ2UnIHZhbHVlPSdlcy1FUycgLz48cGFyYW0gbmFtZT0nZmlsdGVyJyB2YWx1ZT0ncHVibGlzaD15ZXMnIC8+DQoNCjwvb2JqZWN0Pg0KOjo6DQoNCiMjIFJlc3VsdGFkb3MNCg0KIyMgQ29uY2x1c2lvbmVzIHkgdHJhYmFqb3MgZnV0dXJvcw0KDQpgYGB7anMsIGVtYmVkY29kZSwgZWNobyA9IEZBTFNFfQ0KdmFyIGRpdkVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndml6MTY3NDIzNjk5ODYzMicpOyAgICAgICAgICAgICAgICAgICAgDQp2YXIgdml6RWxlbWVudCA9IGRpdkVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29iamVjdCcpWzBdOyAgICAgICAgICAgICAgICAgICAgDQppZiAoIGRpdkVsZW1lbnQub2Zmc2V0V2lkdGggPiA4MDAgKSB7IHZpekVsZW1lbnQuc3R5bGUud2lkdGg9JzEwMCUnO3ZpekVsZW1lbnQuc3R5bGUuaGVpZ2h0PShkaXZFbGVtZW50Lm9mZnNldFdpZHRoKjAuNzUpKydweCc7fSBlbHNlIGlmICggZGl2RWxlbWVudC5vZmZzZXRXaWR0aCA+IDUwMCApIHsgdml6RWxlbWVudC5zdHlsZS53aWR0aD0nMTAwJSc7dml6RWxlbWVudC5zdHlsZS5oZWlnaHQ9KGRpdkVsZW1lbnQub2Zmc2V0V2lkdGgqMC43NSkrJ3B4Jzt9IGVsc2UgeyB2aXpFbGVtZW50LnN0eWxlLndpZHRoPScxMDAlJzt2aXpFbGVtZW50LnN0eWxlLmhlaWdodD0nNjEyN3B4Jzt9ICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsgICAgICAgICAgICAgICAgICAgIHNjcmlwdEVsZW1lbnQuc3JjID0gJ2h0dHBzOi8vcHVibGljLnRhYmxlYXUuY29tL2phdmFzY3JpcHRzL2FwaS92aXpfdjEuanMnOyAgICAgICAgICAgICAgICAgICAgdml6RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHRFbGVtZW50LCB2aXpFbGVtZW50KTsgICAgICAgICAgICAgICAgDQo8L3NjcmlwdD4NCmBgYA0KDQpgYGB7anMsIGVjaG8gPSBGQUxTRX0NCnRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsNCnRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iTG9nbyBSTWFya2Rvd24ucG5nIiBhbHQ9IlRlc3QgSW1hZ2UiIHN0eWxlPSJ3aWR0aDogMjEwcHg7IGhlaWdodDogNDJweDsiPicgKyB0aXRsZS5pbm5lckhUTUwNCmBgYA0K